package com.mall.mymall.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mall.mymall.dao.dto.UserProfileDto;
import com.mall.mymall.dao.entity.Carts;
import com.mall.mymall.dao.entity.Orders;
import com.mall.mymall.dao.entity.UserInfo;
import com.mall.mymall.dao.entity.Users;
import com.mall.mymall.mapper.CartsMapper;
import com.mall.mymall.mapper.OrdersMapper;
import com.mall.mymall.mapper.UserInfoMapper;
import com.mall.mymall.mapper.UsersMapper;
import com.mall.mymall.service.UserInfoService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 十里坡
 * @since 2025-04-01
 */
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {

    @Autowired
    OrdersMapper ordersMapper;

    @Autowired
    CartsMapper cartsMapper;

    @Autowired
    UsersMapper usersMapper;

    /**
     * 获取用户资料
     *
     * 此方法通过用户ID从数据库中获取用户信息和订单、购物车数量，然后将这些信息封装到UserProfileDto对象中返回
     *
     * @param users 用户对象，包含用户ID
     * @return UserProfileDto 用户资料数据传输对象，包含用户信息、订单数量和购物车数量
     */
    @Override
    public UserProfileDto getUserProfile(Users users) {
        // 获取用户ID
        Integer userId = users.getUserId();

        // 通过用户ID获取用户基本信息
        UserInfo userInfo = this.baseMapper.selectById(userId);

        // 通过用户ID获取用户账户信息
        Users users1 = usersMapper.selectById(userId);

        // 创建用户资料数据传输对象实例
        UserProfileDto userProfileDto = new UserProfileDto();

        // 将用户基本信息复制到用户资料DTO中
        BeanUtils.copyProperties(userInfo,userProfileDto);

        // 将用户账户信息复制到用户资料DTO中
        BeanUtils.copyProperties(users1,userProfileDto);

        // 创建订单查询条件，查询属于该用户的所有订单
        QueryWrapper<Orders> ordersQueryWrapper = new QueryWrapper<>();
        ordersQueryWrapper.eq("user_id",userId);

        // 获取用户订单数量
        Integer ordersCount = ordersMapper.selectCount(ordersQueryWrapper);

        // 创建购物车查询条件，查询属于该用户的所有购物车项
        QueryWrapper<Carts> cartsQueryWrapper = new QueryWrapper<>();
        cartsQueryWrapper.eq("user_id",userId);

        // 获取用户购物车数量
        Integer cartCount = cartsMapper.selectCount(cartsQueryWrapper);

        // 设置用户资料DTO中的订单数量
        userProfileDto.setOrdersCount(ordersCount);

        // 设置用户资料DTO中的购物车数量
        userProfileDto.setCartCount(cartCount);

        userProfileDto.setUserName(users1.getUsername());

        // 返回用户资料DTO
        return userProfileDto;
    }
}
